#!/usr/bin/env node

let http = require('http'),
    fs = require('fs'),
    items = loadData();

http.createServer((req, res) => {
    console.log(req.headers);
    console.log('');

    switch(req.method) {
        case 'GET':
            get(res);
            break;

        case 'POST':
            insert(req, res);
            break;

        case 'DELETE':
            del(req, res);
            break;

        case 'PUT':
            change(req, res);
            break;

        default:
            break;    
    }
}).listen(8080);

function get(res) {
    let body = JSON.stringify(items);

    res.setHeader('Content-Length', Buffer.byteLength(body));
    res.setHeader('Content-Type', 'text/plain; charset="utf-8"');
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.end(body);
}

function insert(req, res) {
    let item = '';

    req.on('data', (data) => { item += data; });
    req.on('end', () => {
        items.push(item);
        res.setHeader('Access-Control-Allow-Origin', '*')
        res.end('Insert OK!');              
    });
}

function del(req, res) {
    let arg = req.url.split('/');
    if(arg[1] === '') {
        items = [];
    }

    let i = parseInt(arg[1]);

    res.setHeader('Access-Control-Allow-Origin', '*');

    if(!items[i]) {
        res.statusCode = 404;
        res.end('Not found');           
    } else {
        items.splice(i, 1);
        res.end('Delete OK');      
    }
}

function change(req, res) {
    let arg = req.url.split('/');
    if(arg[1] === '') {
        items = [];  
    }

    let item = '';
    res.setHeader('Access-Control-Allow-Origin', '*');
    req.on('data', (chunk) => { item += chunk;  });
    req.on('end', () => {
        let i = parseInt(arg[1]);

        if(!items[i]) {
            res.statusCode = 404;
            res.end('Not found');
        } else {
            items[i] = item;
            res.end('Change OK');        
        }   
    });
}

function loadData() {
    try {
        let data = fs.readFileSync('./data.txt', 'utf8');
        console.log(data);
        return JSON.parse(data);
                  
    } catch(e) { 
        return []; 
    }
}

process.on('SIGINT', () => {
    fs.writeFileSync('./data.txt', JSON.stringify(items));
    process.exit();
});
